/**
 * Package de la couche data.
 */
package fr.afcepf.atod21.mp.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.List;

import javax.sql.DataSource;

import fr.afcepf.atod21.mp.entities.Stagiaire;
import fr.afcepf.atod21.mp.exception.Atod21Exception;

/**
 * @author Stagiaire Implementation de l'interface {@link IDaoStagiaire}
 */
public class DaoStagiaireImpl implements IDaoStagiaire {
    /**
     * DataSource pour l'acces a la BDD.
     */
    private DataSource dataSource = new Atod21DataSource();
    /**
     * Requete pour l'ajout d'un stagiaire.
     */
    private final String reqAjout = "INSERT into stagiaire "
            + "(nom,prenom,adresse,date_naissance,id_organisme)" + " VALUES "
            + "(?,?,?,?,?)";
    /**
     * Indice parametre pour la requeste SQL.
     */
    private final int indiceNomReqAjout = 1;
    /**
     * Indice parametre pour la requeste SQL.
     */
    private final int indicePrenomReqAjout = 2;
    /**
     * Indice parametre pour la requeste SQL.
     */
    private final int indiceAdresseReqAjout = 3;
    /**
     * Indice parametre pour la requeste SQL.
     */
    private final int indiceDateNaissanceReqAjout = 4;
    /**
     * Indice parametre pour la requeste SQL.
     */
    private final int indiceIdOrganismeReqAjout = 5;
    /**
     * Requete pour le renvoi d'un stagiaire.
     * On precise l'id_organisme pour s'assurer de modifier le stagiaire avec cet id
     * et CET organisme en theorie, lors d'un update on test TOUS les champs pour
     *  s'assurer de modifier/supprimer le bon stagiaire.
     */
    private final String reqRenvoi = "UPDATE stagiaire "
            + "SET id_organisme=null "
            + "WHERE idstagiaire = ? and id_organisme = ?";
    // on precise l'id_organisme pour s'assurer de modifier le stagiaire avec cet id et CET organisme.
    // en theorie, lors d'un update on test TOUS les champs pour s'assurer de modifier/supprimer le bon stagiaire.
    /**
     * Indice parametre pour la requeste SQL.
     */
    private final int indiceIdOrganismeReqRenvoi = 2;
    /**
     * Indice parametre pour la requeste SQL.
     */
    private final int indiceIdStagiaireReqRenvoi = 1;

    @Override
    public List<Stagiaire> rechercher(String paramNom) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public List<Stagiaire> rechercher(int paramIdOrganisme) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Stagiaire ajouter(Stagiaire paramStagiaire) throws Atod21Exception {
        try {
            Connection connection = dataSource.getConnection();
            PreparedStatement statement = connection.prepareStatement(reqAjout,
                    Statement.RETURN_GENERATED_KEYS);
            statement.setString(indiceNomReqAjout, paramStagiaire.getNom());
            statement.setString(indicePrenomReqAjout,
                    paramStagiaire.getPrenom());
            statement.setString(indiceAdresseReqAjout,
                    paramStagiaire.getAdresse());
            statement.setDate(indiceDateNaissanceReqAjout,
                    new java.sql.Date(paramStagiaire.getDateNaissance().getTime()));

            if (paramStagiaire.getOrganisme() != null) {
                statement.setInt(indiceIdOrganismeReqAjout, paramStagiaire
                        .getOrganisme().getIdOrganisme());

            } else {
                statement.setNull(indiceIdOrganismeReqAjout, Types.INTEGER);
            }
            int resultSql = statement.executeUpdate();
            if (resultSql == 1) {
                ResultSet rs = statement.getGeneratedKeys();
                if (rs.next()) {
                    paramStagiaire.setIdStagiaire(rs.getInt(1));
                }
            }
        } catch (SQLException e) {
            throw new Atod21Exception(
                    "Erreur 10001 - DaoStagaireImpl --> ajouter");
        }
        return paramStagiaire;
    }

    @Override
    public Stagiaire renvoyer(Stagiaire paramStagiaire) throws Atod21Exception {
        try {
            Connection connection = dataSource.getConnection();
            PreparedStatement preparedStatement = connection.prepareStatement(reqRenvoi);
            preparedStatement.setInt(indiceIdOrganismeReqRenvoi, paramStagiaire.getOrganisme().getIdOrganisme());
            preparedStatement.setInt(indiceIdStagiaireReqRenvoi, paramStagiaire.getIdStagiaire());
            if (preparedStatement.executeUpdate() == 1) {
                paramStagiaire.setOrganisme(null);
            } else {
                throw new Atod21Exception("Erreur 10002 - DaoStagaireImpl --> renvoi "
            + "Le stagiaire n'est pas dans cet organisme ");
            }

        } catch (SQLException e) {
            throw new Atod21Exception(
                    "Erreur 10002 - DaoStagaireImpl --> renvoi" + e.getMessage());
        }
        return paramStagiaire;
    }

}
